home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / readin.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  24.1 KB  |  824 lines

  1. c spice version 2g.6  sccsid=readin.ma 3/22/83
  2.       subroutine readin
  3.       implicit double precision (a-h,o-z)
  4. c
  5. c
  6. c     this routine drives the input processing of spice.  element cards
  7. c and device models are handled by this routine.
  8. c
  9. c spice version 2g.6  sccsid=tabinf 3/15/83
  10.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  11.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  12.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  13.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  14.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  15.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  16.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  17.      7   irowno,jcolno,nttbr,nttar,lvntmp
  18. c spice version 2g.6  sccsid=miscel 3/15/83
  19.       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
  20.      1  defas,rstats(50),iwidth,lwidth,nopage
  21. c spice version 2g.6  sccsid=line 3/15/83
  22.       common /line/ achar,afield(15),oldlin(15),kntrc,kntlim
  23. c spice version 2g.6  sccsid=cirdat 3/15/83
  24.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  25.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  26. c spice version 2g.6  sccsid=status 3/15/83
  27.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  28.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  29.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  30. c spice version 2g.6  sccsid=flags 3/15/83
  31.       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
  32.      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,itl6,igoof,nogo,keof
  33. c spice version 2g.6  sccsid=knstnt 3/15/83
  34.       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
  35.      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox,
  36.      2   pivtol,pivrel
  37. c spice version 2g.6  sccsid=dc 3/15/83
  38.       common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
  39.      1   kinel,kidin,kovar,kidout
  40. c spice version 2g.6  sccsid=ac 3/15/83
  41.       common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
  42.      1   inoise,nosprt,nosout,nosin,idist,idprt
  43. c spice version 2g.6  sccsid=tran 3/15/83
  44.       common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
  45. c spice version 2g.6  sccsid=outinf 3/15/83
  46.       common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
  47.      1   ilogy(8),npoint,numout,kntr,numdgt
  48. c spice version 2g.6  sccsid=cje 3/15/83
  49.       common /cje/ maxtim,itime,icost
  50. c spice version 2g.6  sccsid=debug 3/15/83
  51.       common/debug/ idebug(20)
  52. c spice version 2g.6  sccsid=blank 3/15/83
  53.       common /blank/ value(200000)
  54.       integer nodplc(64)
  55.       complex cvalue(32)
  56.       equivalence (value(1),nodplc(1),cvalue(1))
  57. c
  58. c  control card identifiers
  59. c
  60.       dimension aide(20),nnods(20),ntnods(20),l2nod(24)
  61.       dimension numic(4)
  62.       dimension aidm(7),ipolar(7),modid(7),ipar(5),ampar(115)
  63.       dimension titinp(4)
  64.       dimension aidc(22)
  65.       data titinp / 8hinput li, 8hsting   , 8h        , 8h         /
  66.       data naidc / 22 /
  67.       data aidc / 8hac      , 8hdc      , 8hdistorti, 8hend     ,
  68.      1            8hends    , 8hfourier , 8hmodel   , 8hnoise   ,
  69.      2            8hop      , 8hoptions , 8hplot    , 8hprint   ,
  70.      3            8hsubckt  , 8hsensitiv, 8htransien, 8htf      ,
  71.      4            8htemperat, 8hwidth   , 8hnodeset , 8hic      ,
  72.      5            8h:debug: , 8halter   /
  73. c
  74. c  element card identifiers, keywords, and information
  75. c
  76.       data aide / 1hr,1hc,1hl,1hk,1hg,1he,1hf,1hh,1hv,1hi,1hd,1hq,1hj,
  77.      1   1hm,1hs,1hy,1ht,0.0d0,1hx,0.0d0 /
  78.       data alsac,alspu,alsex,alssi /2hac,2hpu,2hex,2hsi/
  79.       data alsoff,alsdc,alspw / 3hoff,2hdc,3hpw  /
  80.       data alsz0,alszo,alsnl,alsf,alstd / 2hz0,2hzo,2hnl,1hf,2htd /
  81.       data alsl,alsw,alsas,alsad,alspd,alsps,alsrds,alsrss,alsxqc
  82.      1   /1hl,1hw,2has,2had,2hpd,2hps,3hnrd,3hnrs,3hxqc/
  83.       data alszx /2hzx/
  84.       data alssf / 4hsf   /
  85.       data apoly, aic, area / 4hpoly, 2hic, 4harea /
  86.       data alstc / 2htc /
  87.       data numic / 1, 2, 2, 3 /
  88.       data ablnk, aper / 1h , 1h. /
  89.       data nnods / 2,2,2,0,2,2,2,2,2,2,2,3,3,4,4,4,4,0,0,0 /
  90.       data ntnods / 2,2,2,0,2,2,2,2,2,2,3,6,5,6,4,4,4,0,0,0 /
  91.       data l2nod / 8,12,14, 6,13,14,13,14,11, 6,
  92.      1            16,36,25,33, 6, 6,33, 0, 3, 3,
  93.      2             3, 3, 3, 3 /
  94. c
  95. c  model card keywords
  96. c
  97.       data aidm /1hd,3hnpn,3hpnp,3hnjf,3hpjf,4hnmos,4hpmos/
  98.       data ipolar /0,1,-1,1,-1,1,-1/
  99.       data modid /1,2,2,3,3,4,4/
  100.       data ipar / 0, 14, 60, 72, 114/
  101.       data ampar /
  102.      1   6his    ,6hrs    ,6hn     ,6htt    ,6hcjo   ,6hvj    ,6hm     ,
  103.      2   6heg    ,6hxti   ,6hkf    ,6haf    ,6hfc    ,6hbv    ,6hibv   ,
  104.      1   6his    ,6hbf    ,6hnf    ,6hvaf   ,6hikf   ,6hise   ,6hne    ,
  105.      2   6hbr    ,6hnr    ,6hvar   ,6hikr   ,6hisc   ,6hnc    ,6h0     ,
  106.      3   6h0     ,6hrb    ,6hirb   ,6hrbm   ,6hre    ,6hrc    ,6hcje   ,
  107.      4   6hvje   ,6hmje   ,6htf    ,6hxtf   ,6hvtf   ,6hitf   ,6hptf   ,
  108.      5   6hcjc   ,6hvjc   ,6hmjc   ,6hxcjc  ,6htr    ,6h0     ,6h0     ,
  109.      6   6h0     ,6h0     ,6hcjs   ,6hvjs   ,6hmjs   ,6hxtb   ,6heg    ,
  110.      7   6hxti   ,6hkf    ,6haf    ,6hfc    ,
  111.      1   6hvto   ,6hbeta  ,6hlambda,6hrd    ,6hrs    ,6hcgs   ,6hcgd   ,
  112.      2   6hpb    ,6his    ,6hkf    ,6haf    ,6hfc    ,
  113.      1   6hlevel ,6hvto   ,6hkp    ,6hgamma ,6hphi   ,6hlambda,6hrd    ,
  114.      2   6hrs    ,6hcbd   ,6hcbs   ,6his    ,6hpb    ,6hcgso  ,6hcgdo  ,
  115.      3   6hcgbo  ,6hrsh   ,6hcj    ,6hmj    ,6hcjsw  ,6hmjsw  ,6hjs    ,
  116.      4   6htox   ,6hnsub  ,6hnss   ,6hnfs   ,6htpg   ,6hxj    ,6hld    ,
  117.      5   6huo    ,6hucrit ,6huexp  ,6hutra  ,6hvmax  ,6hneff  ,6hxqc   ,
  118.      6   6hkf    ,6haf    ,6hfc    ,6hdelta ,6htheta ,6heta   ,6hkappa ,
  119.      7   0.0d0   /
  120. c
  121. c  initialize variables
  122. c
  123.       call second(t1)
  124.       call zero4(idebug,20)
  125.       call getlin
  126.       if (keof.ne.0) go to 6000
  127.       call copy8(afield,atitle,10)
  128.       call getm4(ielmnt,0)
  129.       call getm8(itemps,1)
  130.       value(itemps+1)=27.0d0
  131.       itemno=1
  132.       nopage=0
  133.       call title(-1,72,1,titinp)
  134.       iwidth=80
  135.       do 5 i=1,8
  136.       achar=ablnk
  137.       call move(achar,1,atitle(10),i,1)
  138.       if(achar.eq.ablnk) go to 8
  139.     5 continue
  140.       write(iofile,6)
  141.     6 format('0warning:  input line-width set to 72 columns because',/
  142.      11x,'possible sequencing appears in cols 73-80')
  143.       iwidth=72
  144.     8 do 10 i=1,15
  145.       afield(i)=ablnk
  146.    10 continue
  147.       call copy8(afield,oldlin,15)
  148.       call getm4(isbckt,0)
  149.       nsbckt=0
  150.       call getm8(iunsat,0)
  151.       nunsat=0
  152.       numalt=0
  153.       numcyc=0
  154.       lwidth=132
  155.       iprnta=0
  156.       iprntl=0
  157.       iprntm=1
  158.       iprntn=0
  159.       iprnto=0
  160.       gmin=1.0d-12
  161.       pivtol=1.0d-13
  162.       pivrel=1.0d-3
  163.       reltol=0.001d0
  164.       abstol=1.0d-12
  165.       vntol=1.0d-6
  166.       trtol=7.0d0
  167.       chgtol=1.0d-14
  168.       defl=1.0d-4
  169.       defw=1.0d-4
  170.       defad=0.0d0
  171.       defas=0.0d0
  172.       numdgt=4
  173.       numtem=1
  174.       itl1=100
  175.       itl2=50
  176.       itl3=4
  177.       itl4=10
  178.       itl5=5000
  179.       itl6=0
  180.       limtim=2
  181.       limpts=201
  182.       lvlcod=1
  183.       lvltim=2
  184.       method=1
  185.       xmu=0.5d0
  186.       maxord=2
  187.       nosolv=0
  188.       icvflg=0
  189.       itcelm(2)=0
  190.       idist=0
  191.       idprt=0
  192.       inoise=0
  193.       jacflg=0
  194.       jtrflg=0
  195.       call getm4(ifour,0)
  196.       nfour=0
  197.       call getm4(nsnod,0)
  198.       call getm8(nsval,0)
  199.       call getm4(icnod,0)
  200.       call getm8(icval,0)
  201.       kinel=0
  202.       kovar=0
  203.       kssop=0
  204.       nosprt=0
  205.       nsens=0
  206.       call getm4(isens,0)
  207.       numnod=0
  208.       ncnods=0
  209.       nunods=0
  210.       call zero4(locate,50)
  211.       call zero4(jelcnt,50)
  212.       insize=50
  213.       call getm8(ifield,insize)
  214.       call getm4(icode,insize)
  215.       call getm8(idelim,insize)
  216.       call getm4(icolum,insize)
  217.       go to 50
  218. c
  219. c  error entry
  220. c
  221.    40 nogo=1
  222. c
  223. c  read and decode next card in input deck
  224. c
  225.    50 igoof=0
  226.       call card
  227.       if (keof.ne.0) go to 5000
  228.       if (igoof.ne.0) go to 40
  229.       if (nodplc(icode+1).eq.0) go to 95
  230.       anam=value(ifield+1)
  231.       call move(anam,2,ablnk,1,7)
  232.       if (anam.ne.aper) go to 70
  233.       call move(anam,1,value(ifield+1),2,7)
  234.       call keysrc(aidc,naidc,anam,id)
  235.       if (id.le.0) go to 90
  236.       if (id.eq.4) go to 5000
  237.       if (id.eq.5) go to 800
  238.       if (id.eq.7) go to 500
  239.       if (id.eq.13) go to 700
  240.       if (id.eq.22) numalt=numalt+1
  241.       if (nsbckt.ge.1) go to 85
  242.       if (id.ne.22) call runcon(id)
  243.       if (igoof.ne.0) go to 40
  244.       go to 50
  245.    70 id=0
  246.    80 id=id+1
  247.       if (id.gt.20) go to 90
  248.       if (anam.eq.aide(id)) go to 100
  249.       go to 80
  250.    85 write (iofile,86)
  251.    86 format('0warning:  above line not allowed within subcircuit -- ',
  252.      1   'ignored'/)
  253.       go to 50
  254.    90 write (iofile,91) value(ifield+1)
  255.    91 format('0*error*:  unknown data card:  ',a8/)
  256.       go to 40
  257.    95 write (iofile,96)
  258.    96 format('0*error*:  unrecognizable data card'/)
  259.       go to 40
  260. c
  261. c  element and device cards
  262. c
  263.   100 call find(value(ifield+1),id,loc,1)
  264.       locv=nodplc(loc+1)
  265.       if (id.eq.4) go to 140
  266.       if (id.eq.19) go to 900
  267.       istop=nnods(id)+1
  268.       if (nodplc(loc+l2nod(id)).ne.0) go to 113
  269.       do 110 i=2,istop
  270.       if (nodplc(icode+i).ne.0) go to 410
  271.       if (value(ifield+i).lt.0.0d0) go to 400
  272.   110 nodplc(loc+i)=value(ifield+i)
  273.       go to 115
  274.   113 do 114 i=2,istop
  275.       nodplc(loc+i)=0
  276.   114 continue
  277.   115 go to (120,130,130,140,150,150,180,180,200,200,300,300,300,300,
  278.      1   390,390,350,390,390,390), id
  279. c
  280. c  resistor
  281. c
  282.   120 if (nodplc(icode+4).ne.0) go to 420
  283.       if (value(ifield+4).eq.0.0d0) go to 480
  284.       value(locv+2)=value(ifield+4)
  285.       ifld=4
  286.   122 ifld=ifld+1
  287.       if (nodplc(icode+ifld)) 50,122,124
  288.   124 anam=value(ifield+ifld)
  289.       if (anam.ne.alstc) go to 460
  290.       ifld=ifld+1
  291.       if (nodplc(icode+ifld)) 50,126,124
  292.   126 value(locv+3)=value(ifield+ifld)
  293.       ifld=ifld+1
  294.       if (nodplc(icode+ifld)) 50,128,124
  295.   128 value(locv+4)=value(ifield+ifld)
  296.       go to 50
  297. c
  298. c  capacitor or inductor
  299. c
  300.   130 iknt=0
  301.       ltab=7
  302.       if (id.eq.3) ltab=10
  303.       if (nodplc(icode+4)) 420,131,132
  304.   131 if (value(ifield+4).le.0.0d0) go to 420
  305.       value(locv+1)=value(ifield+4)
  306.       nodplc(loc+4)=1
  307.       ifld=5
  308.       if (nodplc(icode+ifld)) 50,420,139
  309.   132 call getm8(nodplc(loc+ltab),0)
  310.       anam=value(ifield+4)
  311.       if (anam.ne.apoly) go to 450
  312.       ifld=4
  313.   134 ifld=ifld+1
  314.       if (nodplc(icode+ifld)) 50,136,138
  315.   136 call extmem(nodplc(loc+ltab),1)
  316.       iknt=iknt+1
  317.       ispot=nodplc(loc+ltab)+iknt
  318.       value(ispot)=value(ifield+ifld)
  319.       go to 134
  320.   138 if (iknt.eq.0) go to 420
  321.   139 anam=value(ifield+ifld)
  322.       if (anam.ne.aic) go to 460
  323.       ifld=ifld+1
  324.       if (nodplc(icode+ifld).ne.0) go to 50
  325.       value(locv+2)=value(ifield+ifld)
  326.       go to 50
  327. c
  328. c  mutual inductance
  329. c
  330.   140 if (nodplc(icode+2).ne.1) go to 430
  331.       anam=value(ifield+2)
  332.       call move(anam,2,ablnk,1,7)
  333.       if (anam.ne.aide(3)) go to 430
  334.       call extnam(value(ifield+2),nodplc(loc+2))
  335.       if (nodplc(icode+3).ne.1) go to 430
  336.       anam=value(ifield+3)
  337.       call move(anam,2,ablnk,1,7)
  338.       if (anam.ne.aide(3)) go to 430
  339.       call extnam(value(ifield+3),nodplc(loc+3))
  340.       if (nodplc(icode+4).ne.0) go to 420
  341.       xk=value(ifield+4)
  342.       if (xk.le.0.0d0) go to 420
  343.       if (xk.le.1.0d0) go to 145
  344.       xk=1.0d0
  345.       write (iofile,141)
  346.   141 format('0warning:  coefficient of coupling reset to 1.0d0'/)
  347.   145 value(locv+1)=xk
  348.       go to 50
  349. c
  350. c  voltage controlled (nonlinear) sources
  351. c
  352.   150 ndim=1
  353.       ifld=3
  354.       if (nodplc(icode+4)) 410,156,152
  355.   152 anam=value(ifield+4)
  356.       if (anam.ne.apoly) go to 450
  357.       if (nodplc(icode+5).ne.0) go to 420
  358.       ndim=value(ifield+5)
  359.       if (ndim.le.0) go to 420
  360.       ifld=5
  361.   156 nodplc(loc+4)=ndim
  362.       ltab=id+1
  363.       nssnod=2*ndim
  364.       nmat=4*ndim
  365.       if (id.eq.6) nmat=4+2*ndim
  366.       call getm4(nodplc(loc+ltab),nssnod)
  367.       call getm4(nodplc(loc+ltab+1),nmat)
  368.       call getm8(nodplc(loc+ltab+2),0)
  369.       call getm8(nodplc(loc+ltab+3),ndim)
  370.       call getm4(nodplc(loc+ltab+4),ndim)
  371.       call getm8(nodplc(loc+ltab+5),ndim)
  372.       ispot=nodplc(loc+ltab+5)
  373.       call zero8(value(ispot+1),ndim)
  374.       lnod=nodplc(loc+ltab)
  375.       do 158 i=1,nssnod
  376.       ifld=ifld+1
  377.       if (nodplc(icode+ifld).ne.0) go to 410
  378.       if (value(ifield+ifld).lt.0.0d0) go to 400
  379.       nodplc(lnod+i)=value(ifield+ifld)
  380.   158 continue
  381.   160 iknt=0
  382.   162 ifld=ifld+1
  383.       if (nodplc(icode+ifld).ne.0) go to 164
  384.       call extmem(nodplc(loc+ltab+2),1)
  385.       iknt=iknt+1
  386.       ispot=nodplc(loc+ltab+2)+iknt
  387.       value(ispot)=value(ifield+ifld)
  388.       go to 162
  389.   164 if (iknt.eq.0) go to 420
  390.       if (nodplc(icode+ifld).ne.1) go to 170
  391.       anam=value(ifield+ifld)
  392.       if (anam.ne.aic) go to 460
  393.       do 168 i=1,ndim
  394.       ifld=ifld+1
  395.       if (nodplc(icode+ifld)) 170,166,420
  396.   166 ispot=nodplc(loc+ltab+5)+i
  397.       value(ispot)=value(ifield+ifld)
  398.   168 continue
  399.   170 if (ndim.ne.1) go to 50
  400.       if (iknt.ne.1) go to 50
  401.       call extmem(nodplc(loc+ltab+2),1)
  402.       ispot=nodplc(loc+ltab+2)
  403.       value(ispot+2)=value(ispot+1)
  404.       value(ispot+1)=0.0d0
  405.       go to 50
  406. c
  407. c  current controlled (nonlinear) sources
  408. c
  409.   180 ndim=1
  410.       ifld=3
  411.       if (nodplc(icode+4).ne.1) go to 470
  412.       anam=value(ifield+4)
  413.       if (anam.ne.apoly) go to 182
  414.       ifld=5
  415.       if (nodplc(icode+5).ne.0) go to 420
  416.       ndim=value(ifield+5)
  417.       if (ndim.le.0) go to 420
  418.   182 nodplc(loc+4)=ndim
  419.       ltab=id-1
  420.       nmat=2*ndim
  421.       if (id.eq.8) nmat=4+ndim
  422.       call getm4(nodplc(loc+ltab),ndim)
  423.       call getm4(nodplc(loc+ltab+1),nmat)
  424.       call getm8(nodplc(loc+ltab+2),0)
  425.       call getm8(nodplc(loc+ltab+3),ndim)
  426.       call getm4(nodplc(loc+ltab+4),ndim)
  427.       call getm8(nodplc(loc+ltab+5),ndim)
  428.       ispot=nodplc(loc+ltab+5)
  429.       call zero8(value(ispot+1),ndim)
  430.       do 184 i=1,ndim
  431.       ifld=ifld+1
  432.       if (nodplc(icode+ifld).ne.1) go to 470
  433.       anam=value(ifield+ifld)
  434.       call move(anam,2,ablnk,1,7)
  435.       if (anam.ne.aide(9)) go to 470
  436.       call extnam(value(ifield+ifld),loct)
  437.       ispot=nodplc(loc+ltab)+i
  438.       nodplc(ispot)=loct
  439.   184 continue
  440.       go to 160
  441. c
  442. c  independent sources
  443. c
  444.   200 ifld=3
  445.       call getm8(nodplc(loc+5),0)
  446.   210 ifld=ifld+1
  447.   215 if (nodplc(icode+ifld)) 50,220,230
  448.   220 if (ifld.gt.4) go to 210
  449.   225 value(locv+1)=value(ifield+ifld)
  450.       go to 210
  451.   230 anam=value(ifield+ifld)
  452.       if (anam.ne.alsdc) go to 235
  453.       ifld=ifld+1
  454.       if (nodplc(icode+ifld)) 50,225,230
  455.   235 if (anam.ne.alsac) go to 260
  456.       value(locv+2)=1.0d0
  457.       ifld=ifld+1
  458.       if (nodplc(icode+ifld)) 50,240,230
  459.   240 value(locv+2)=value(ifield+ifld)
  460.       ifld=ifld+1
  461.       if (nodplc(icode+ifld)) 50,250,230
  462.   250 value(locv+3)=value(ifield+ifld)
  463.       go to 210
  464.   260 id=0
  465.       call move(anam,3,ablnk,1,6)
  466.       if (anam.eq.alspu) id=1
  467.       if (anam.eq.alssi) id=2
  468.       if (anam.eq.alsex) id=3
  469.       if (anam.eq.alspw) id=4
  470.       if (anam.eq.alssf) id=5
  471.       if (id.eq.0) go to 450
  472.       nodplc(loc+4)=id
  473.       iknt=0
  474.   270 ifld=ifld+1
  475.       if (nodplc(icode+ifld).ne.0) go to 280
  476.       call extmem(nodplc(loc+5),1)
  477.       iknt=iknt+1
  478.       ispot=nodplc(loc+5)+iknt
  479.       value(ispot)=value(ifield+ifld)
  480.       go to 270
  481.   280 aval=0.0d0
  482.       if (id.ne.4) go to 285
  483. c...  for pwl source function, force even number of input values
  484.       ibit=0
  485.       if(iknt.ne.(iknt/2)*2) ibit=1
  486.       aval=value(ispot)
  487.       if (ibit.eq.0) go to 290
  488.       call extmem(nodplc(loc+5),1)
  489.       aval=value(ispot-1)
  490.       iknt=iknt+1
  491.       ispot=nodplc(loc+5)+iknt
  492.       value(ispot)=aval
  493.       go to 290
  494.   285 if (iknt.ge.7) go to 215
  495.   290 call extmem(nodplc(loc+5),2)
  496.       ispot=nodplc(loc+5)+iknt
  497.       value(ispot+1)=0.0d0
  498.       value(ispot+2)=aval
  499.       iknt=iknt+2
  500.       go to 285
  501. c
  502. c  device cards
  503. c
  504.   300 value(locv+1)=1.0d0
  505.       if (id.ne.14) go to 305
  506.       value(locv+1)=0.0d0
  507.       value(locv+11)=0.0d0
  508.       value(locv+12)=0.0d0
  509.       value(locv+13)=1.0d0
  510.       value(locv+14)=1.0d0
  511.       value(locv+15)=0.0d0
  512.   305 locm=loc+ntnods(id)+2
  513.       ifld=nnods(id)+2
  514. c
  515. c  temporarily (until modchk) put bjt's substrate node into nodplc(loc+5)
  516. c
  517.       if(id.ne.12) go to 308
  518.       if(nodplc(icode+5).ne.0) go to 308
  519.       ifld=6
  520.       if (nodplc(loc+l2nod(id)).ne.0) go to 306
  521.       nodplc(loc+5)=value(ifield+5)
  522.       go to 308
  523.   306 nodplc(loc+5)=0
  524.   308 continue
  525. c
  526. c    reserve device internal nodes,read device geometry parameters
  527. c    and initial conditions
  528. c
  529.       if (nodplc(icode+ifld).ne.1) go to 440
  530.       call extnam(value(ifield+ifld),nodplc(locm))
  531.   310 ifld=ifld+1
  532.       if (nodplc(icode+ifld)) 50,325,315
  533.   315 anam=value(ifield+ifld)
  534.       if (anam.ne.alsoff) go to 320
  535.       nodplc(locm+1)=1
  536.       go to 310
  537.   320 if (anam.ne.area) go to 330
  538.       ifld=ifld+1
  539.       if (nodplc(icode+ifld)) 50,325,315
  540.   325 if (value(ifield+ifld).le.0.0d0) go to 420
  541.       if (id.eq.14) go to 343
  542.       value(locv+1)=value(ifield+ifld)
  543.       go to 310
  544.   330 if (anam.ne.aic) go to 341
  545.       iknt=0
  546.       icloc=0
  547.       if (id.eq.14) icloc=3
  548.       maxknt=numic(id-10)
  549.   335 ifld=ifld+1
  550.       if (nodplc(icode+ifld)) 50,340,315
  551.   340 iknt=iknt+1
  552.       if (iknt.gt.maxknt) go to 335
  553.       value(locv+icloc+iknt+1)=value(ifield+ifld)
  554.       go to 335
  555.   341 if (id.ne.14) go to 460
  556.       ispot=0
  557.       if (anam.eq.alsl) ispot=1
  558.       if (anam.eq.alsw) ispot=2
  559.       if (anam.eq.alsad) ispot=3
  560.       if (anam.eq.alszx) ispot=3
  561.       if (anam.eq.alsas) ispot=4
  562.       if (anam.eq.alspd) ispot=11
  563.       if (anam.eq.alsps) ispot=12
  564.       if (anam.eq.alsrds) ispot=13
  565.       if (anam.eq.alsrss) ispot=14
  566.       if (anam.eq.alsxqc) ispot=15
  567.       if (ispot.eq.0) go to 460
  568.       ifld=ifld+1
  569.       if (nodplc(icode+ifld)) 50,342,315
  570.   342 if (value(ifield+ifld).le.0.0d0) go to 420
  571.       value(locv+ispot)=value(ifield+ifld)
  572.       go to 310
  573.   343 iknt=0
  574.   344 iknt=iknt+1
  575.       if(value(ifield+ifld).le.0.0d0) go to 420
  576.       if(iknt.gt.15) go to 490
  577.       if(iknt.eq.5) iknt=11
  578.       value(locv+iknt)=value(ifield+ifld)
  579.       ifld=ifld+1
  580.       if(nodplc(icode+ifld)) 345,344,345
  581.   345 if(nodplc(icode+ifld)) 50,50,315
  582. c
  583. c  transmission lines
  584. c
  585.   350 ifld=5
  586.       xnl=0.25d0
  587.       tfreq=0.0d0
  588.   355 ifld=ifld+1
  589.       if (nodplc(icode+ifld)) 378,355,360
  590.   360 anam=value(ifield+ifld)
  591.       if (anam.eq.aic) go to 364
  592.       if (anam.eq.alsnl) go to 370
  593.       if (anam.eq.alsf) go to 374
  594.       id=0
  595.       if (anam.eq.alsz0) id=1
  596.       if (anam.eq.alszo) id=1
  597.       if (anam.eq.alstd) id=2
  598.       if (id.eq.0) go to 460
  599.       ifld=ifld+1
  600.       if (nodplc(icode+ifld)) 378,362,360
  601.   362 if (value(ifield+ifld).le.0.0d0) go to 420
  602.       value(locv+id)=value(ifield+ifld)
  603.       go to 355
  604.   364 iknt=0
  605.   366 ifld=ifld+1
  606.       if (nodplc(icode+ifld)) 378,368,360
  607.   368 iknt=iknt+1
  608.       if (iknt.gt.4) go to 366
  609.       value(locv+iknt+4)=value(ifield+ifld)
  610.       go to 366
  611.   370 ifld=ifld+1
  612.       if (nodplc(icode+ifld)) 378,372,360
  613.   372 if (value(ifield+ifld).le.0.0d0) go to 420
  614.       xnl=value(ifield+ifld)
  615.       go to 355
  616.   374 ifld=ifld+1
  617.       if (nodplc(icode+ifld)) 378,376,360
  618.   376 if (value(ifield+ifld).le.0.0d0) go to 420
  619.       tfreq=value(ifield+ifld)
  620.       go to 355
  621.   378 if (value(locv+1).ne.0.0d0) go to 380
  622.       write (iofile,379)
  623.   379 format('0*error*:  z0 must be specified'/)
  624.       go to 40
  625.   380 if (value(locv+2).ne.0.0d0) go to 50
  626.       if (tfreq.ne.0.0d0) go to 382
  627.       write (iofile,381)
  628.   381 format('0*error*:  either td or f must be specified'/)
  629.       go to 40
  630.   382 value(locv+2)=xnl/tfreq
  631.       go to 50
  632. c
  633. c  elements not yet implemented
  634. c
  635.   390 write (iofile,391)
  636.   391 format('0*error*:  element type not yet implemented'/)
  637.       go to 40
  638. c
  639. c  element card errors
  640. c
  641.   400 write (iofile,401)
  642.   401 format('0*error*:  negative node number found'/)
  643.       go to 40
  644.   410 write (iofile,411)
  645.   411 format('0*error*:  node numbers are missing'/)
  646.       go to 40
  647.   420 write (iofile,421)
  648.   421 format('0*error*:  value is missing or is nonpositive'/)
  649.       go to 40
  650.   430 write (iofile,431)
  651.   431 format('0*error*:  mutual inductance references are missing'/)
  652.       go to 40
  653.   440 write (iofile,441)
  654.   441 format('0*error*:  model name is missing'/)
  655.       go to 40
  656.   450 write (iofile,451) anam
  657.   451 format('0*error*:  unknown source function:  ',a8)
  658.       go to 40
  659.   460 write (iofile,461) anam
  660.   461 format('0*error*:  unknown parameter:  ',a8/)
  661.       go to 40
  662.   470 write (iofile,471)
  663.   471 format('0*error*:  voltage source not found on above line'/)
  664.       go to 40
  665.   480 write (iofile,481)
  666.   481 format('0*error*:  value is zero'/)
  667.       go to 40
  668.   490 write(iofile,491)
  669.   491 format('0*error*:  extra numerical data on mosfet card'/)
  670.       go to 40
  671. c
  672. c  model card
  673. c
  674.   500 if (nodplc(icode+2).ne.1) go to 650
  675.       if (nodplc(icode+3).ne.1) go to 650
  676.       id=0
  677.   510 id=id+1
  678.       if (id.gt.7) go to 660
  679.       if (value(ifield+3).ne.aidm(id)) go to 510
  680.       ipol=ipolar(id)
  681.       jtype=modid(id)
  682.       id=jtype+20
  683.       call find(value(ifield+2),id,loc,1)
  684.       nodplc(loc+2)=ipol
  685.       locv=nodplc(loc+1)
  686.   520 locm=ipar(jtype)
  687.       nopar=ipar(jtype+1)-locm
  688.       ifld=3
  689.   530 ifld=ifld+1
  690.       if (nodplc(icode+ifld)) 50,530,560
  691.   560 anam=value(ifield+ifld)
  692.       if(jtype.eq.2) anam=alias(anam)
  693.       iknt=0
  694.   570 iknt=iknt+1
  695.       if (iknt.gt.nopar) go to 670
  696.       if (anam.ne.ampar(locm+iknt)) go to 570
  697.       ifld=ifld+1
  698.       if (nodplc(icode+ifld)) 50,580,560
  699.   580 value(locv+iknt)=value(ifield+ifld)
  700.       ifld=ifld+1
  701.       if (nodplc(icode+ifld)) 50,590,560
  702.   590 iknt=iknt+1
  703.       if (iknt.gt.nopar) go to 530
  704.       if (ablnk.ne.ampar(locm+iknt)) go to 530
  705.       go to 580
  706. c
  707. c  model card errors
  708. c
  709.   650 write (iofile,651)
  710.   651 format('0*error*:  model type is missing'/)
  711.       go to 40
  712.   660 write (iofile,661) value(ifield+3)
  713.   661 format('0*error*:  unknown model type:  ',a8/)
  714.       go to 40
  715.   670 write (iofile,671) anam
  716.   671 format('0*error*:  unknown model parameter:  ',a8,/)
  717.       nogo=1
  718.       go to 530
  719. c
  720. c  subcircuit definition
  721. c
  722.   700 if (nodplc(icode+2).ne.1) go to 780
  723.       call find(value(ifield+2),20,loc,1)
  724.       call extmem(isbckt,1)
  725.       nsbckt=nsbckt+1
  726.       nodplc(isbckt+nsbckt)=loc
  727.       ifld=2
  728.       if (nodplc(icode+3).ne.0) go to 790
  729.       call getm4(nodplc(loc+2),0)
  730.       iknt=0
  731.   710 ifld=ifld+1
  732.       if (nodplc(icode+ifld)) 50,720,710
  733.   720 call extmem(nodplc(loc+2),1)
  734.       iknt=iknt+1
  735.       ispot=nodplc(loc+2)+iknt
  736.       if (value(ifield+ifld).le.0.0d0) go to 770
  737.       nodplc(ispot)=value(ifield+ifld)
  738.       node=nodplc(ispot)
  739.       i=iknt-1
  740.   730 if (i.eq.0) go to 710
  741.       ispot=ispot-1
  742.       if (nodplc(ispot).eq.node) go to 760
  743.       i=i-1
  744.       go to 730
  745.   760 write (iofile,761) node
  746.   761 format('0*error*:  subcircuit definition duplicates node ',i5,/)
  747.       go to 40
  748.   770 write (iofile,771)
  749.   771 format('0*error*:  nonpositive node number found in subcircuit ',
  750.      1   'definition'/)
  751.       go to 40
  752.   780 write (iofile,781)
  753.   781 format('0*error*:  subcircuit name missing'/)
  754.       go to 40
  755.   790 write (iofile,791)
  756.   791 format('0*error*:  subcircuit nodes missing'/)
  757.       go to 40
  758. c
  759. c  .ends processing
  760. c
  761.   800 if (nsbckt.eq.0) go to 890
  762.       iknt=1
  763.       if (nodplc(icode+2).le.0) go to 820
  764.       anam=value(ifield+2)
  765.       iknt=nsbckt
  766.   810 loc=nodplc(isbckt+iknt)
  767.       locv=nodplc(loc+1)
  768.       anams=value(locv)
  769.       if (anam.eq.anams) go to 820
  770.       iknt=iknt-1
  771.       if (iknt.ne.0) go to 810
  772.       go to 880
  773.   820 irel=nsbckt-iknt+1
  774.       call relmem(isbckt,irel)
  775.       nsbckt=nsbckt-irel
  776.       go to 50
  777.   880 write (iofile,881) anam
  778.   881 format('0*error*:  unknown subcircuit name:  ',a8/)
  779.       go to 40
  780.   890 write (iofile,891)
  781.   891 format('0warning:  no subcircuit definition known -- line ignored'
  782.      1/)
  783.       go to 50
  784. c
  785. c  subcircuit call
  786. c
  787.   900 call getm4(nodplc(loc+2),0)
  788.       ifld=1
  789.       iknt=0
  790.   910 ifld=ifld+1
  791.       if (nodplc(icode+ifld).ne.0) go to 920
  792.       call extmem(nodplc(loc+2),1)
  793.       iknt=iknt+1
  794.       ispot=nodplc(loc+2)+iknt
  795.       if (value(ifield+ifld).lt.0.0d0) go to 400
  796.       nodplc(ispot)=value(ifield+ifld)
  797.       go to 910
  798.   920 if (iknt.eq.0) go to 410
  799.       if (nodplc(icode+ifld).ne.1) go to 990
  800.       call extnam(value(ifield+ifld),nodplc(loc+3))
  801.       go to 50
  802.   990 write (iofile,991)
  803.   991 format('0*error*:  subcircuit name missing'/)
  804.       go to 40
  805. c
  806. c  end
  807. c
  808.  5000 if (nsbckt.eq.0) go to 5010
  809.       nsbckt=0
  810.       write (iofile,5001)
  811.  5001 format('0*error*:  .ends  card missing'/)
  812.       nogo=1
  813.  5010 call clrmem(ifield)
  814.       call clrmem(icode)
  815.       call clrmem(idelim)
  816.       call clrmem(icolum)
  817.       call clrmem(isbckt)
  818.       if (nfour.eq.0) call clrmem(ifour)
  819.       if (nsens.eq.0) call clrmem(isens)
  820.  6000 call second(t2)
  821.       rstats(1)=t2-t1
  822.       return
  823.       end
  824.